/*
 * @Author       : Bing Chen chenbing@iocharger.com
 * @Date         : 2024-05-20 22:39:54
 * @LastEditors  : Kangle Zhang zhangkangl@teld.cn
 * @LastEditTime : 2025-03-17 17:45:00
 * @FilePath     : \openchaoji-corelib\evcc\utility\OpenChaoJi_evcc_utility_pilot.h
 * @Description  : 本文件声明EVCC Utility层 Pilot 导引电路识别 模块
 *
 * Copyright (c) 2025 OpenChaoJi
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the icense for the specific language governing permissions and
 * limitations under the License.
 *
 */

#ifndef __OPEN_CHAOJI_EVCC_UTILITY_PILOT_H__
#define __OPEN_CHAOJI_EVCC_UTILITY_PILOT_H__


#include "../../shared/include/OpenChaoJi_shared.h"
#include "./OpenChaoJi_evcc_hal.h"

/*充电机类型识别超时时间*/
#define SYSTEM_PILOT_SECC_TYPE_TIME_OUT		5000
/*等待session模块超时，超时时间大于、等于版本协商时间+1s*/
#define SYSTEM_PILOT_WAIT_SESSION_TIME_OUT 	LINKAGE_CONSULT_MSG_TC_PERIOD + 1000

/**
 * @brief 创建本模块的上下文时需要传入的参数
 */
struct OpenChaoJi_evcc_create_info_utility_pilot {
	int tag;

	/**
     * 本SECC使用的系统类型, 目前仅支持A/B两类
    */
    enum OpenChaoJi_evcc_gbt27930_type evcc_gbt27930_type;
	/**
	 * hal层句柄
	 */
	OpenChaoJi_hal_handle hal_handle;
};

/**
 * @brief 初始化
 *
 * @param info 初始化信息
 * @return 成功返回创建的上下文指针，失败返回NULL。
 */
struct OpenChaoJi_evcc_context_utility_pilot * OpenChaoJi_evcc_utility_pilot_init(const struct OpenChaoJi_evcc_create_info_utility_pilot * info);

/**
 * @brief 销毁
 *
 * @param context 系统上下文指针，包含必要的环境信息。
 * @return 成功返回0，失败返回-1。
 */
int OpenChaoJi_evcc_utility_pilot_term(struct OpenChaoJi_evcc_context_utility_pilot * context);

/**
 * @brief 复位
 *
 * @param context 系统上下文指针，包含必要的环境信息。
 * @return 成功返回0，失败返回-1。
 */
int OpenChaoJi_evcc_utility_pilot_reset(struct OpenChaoJi_evcc_context_utility_pilot * context);

#if (OPENCHAOJI_CONFIG_ENABLE_GBT27930_B == CONFIG_YES)
/**
 * @brief evcc唤醒成功, B类系统需要, A类无此功能
 *
 * @param context 系统上下文指针，包含必要的环境信息。
 * @return 成功返回0，失败返回-1。
 */
int OpenChaoJi_evcc_utility_pilot_wakeup_success(struct OpenChaoJi_evcc_context_utility_pilot * context);

/**
 * @brief evcc确认连接B类系统, B类系统需要, A类无此功能
 *
 * @param context 系统上下文指针，包含必要的环境信息。
 * @return 	成功返回true，失败返回false
 */
bool OpenChaoJi_evcc_utility_pilot_b_confirm_secc_tyep_b(struct OpenChaoJi_evcc_context_utility_pilot * context);
/**
 * @brief evcc确认连接A类系统, B类系统需要, A类无此功能
 *
 * @param context 系统上下文指针，包含必要的环境信息。
 * @return 成功返回true，失败返回false
 */
bool OpenChaoJi_evcc_utility_pilot_b_confirm_secc_tyep_a(struct OpenChaoJi_evcc_context_utility_pilot * context);

/**
 * @brief evcc允许充电, B类系统需要, A类无此功能
 *
 * @param context 系统上下文指针，包含必要的环境信息。
 * @return 成功返回0，失败返回-1。
 */
int OpenChaoJi_evcc_utility_pilot_b_permit_charge(struct OpenChaoJi_evcc_context_utility_pilot * context, bool permit);
#endif
/**
 * @brief 获取evcc的导引状态, 用于判断是否连接, 是否已经确认可以充电等(导引方式, 数据通信另外判断)
 * 		  B类EVCC需要根据当前连接的SECC类型, 决定使用哪种类型的连接状态控制
 * 		  system调用本方法时, 需要确定当前连接的SECC类型后再进行调用, 即该方法二选一调用
 *
 * @param context 系统上下文指针，包含必要的环境信息。
 * @return 返回当前导引连接状态
 */

#if (OPENCHAOJI_CONFIG_ENABLE_GBT27930_A == CONFIG_YES)
enum OpenChaoJi_pilot_status_gbt18487_a OpenChaoJi_evcc_utility_pilot_status_a(struct OpenChaoJi_evcc_context_utility_pilot * context);
#endif
#if (OPENCHAOJI_CONFIG_ENABLE_GBT27930_B == CONFIG_YES)
enum OpenChaoJi_pilot_status_gbt18487_b OpenChaoJi_evcc_utility_pilot_status_b(struct OpenChaoJi_evcc_context_utility_pilot * context);
#endif

// 以下需要根据 pilot_status 给出引导的合理封装
/**
 * @brief 判断secc是否连接中(包含能量传输中等各种状态)
 *
 * @param context 系统上下文指针，包含必要的环境信息。
 * @return secc是否连接中
 */
bool OpenChaoJi_evcc_utility_pilot_is_secc_connected(struct OpenChaoJi_evcc_context_utility_pilot * context);

#if (OPENCHAOJI_CONFIG_ENABLE_GBT27930_B == CONFIG_YES)
/**
 * @brief (B类系统)判断secc是否允许充电(S1是否闭合)
 *
 * @param context 系统上下文指针，包含必要的环境信息。
 * @return secc是否允许充电
 */
bool OpenChaoJi_evcc_utility_pilot_b_is_secc_permit_charge(struct OpenChaoJi_evcc_context_utility_pilot * context);
/**
 * @brief (B类系统)判断evcc/secc是否都允许充电(S2/S1是否闭合)
 *
 * @param context 系统上下文指针，包含必要的环境信息。
 * @return evcc/secc是否允许充电
 */
bool OpenChaoJi_evcc_utility_pilot_b_is_all_permit_charge(struct OpenChaoJi_evcc_context_utility_pilot * context);

/**
 * @brief 获取已经连接的secc类型
 * 		  用于B类系统在导引阶段通过Sv开关闭合后的检测点3电压确认对端SECC系统
 *
 * @param context 系统上下文指针，包含必要的环境信息。
 * @return B类系统在Sv开关闭合状态下的对端SECC类型
 */
enum OpenChaoJi_secc_gbt27930_type OpenChaoJi_evcc_utility_pilot_b_connected_secc_type(struct OpenChaoJi_evcc_context_utility_pilot * context);
/**
 * @brief 获取evcc已经确认的secc类型
 * 		  由于B类系统在进入自检状态前会断开Sv开关, 所以需要通过导引阶段确认对端SECC系统并进行记录
 *
 * @param context 系统上下文指针，包含必要的环境信息。
 * @return B类系统在导引阶段确认的对端SECC系统
 */
enum OpenChaoJi_secc_gbt27930_type OpenChaoJi_evcc_utility_pilot_b_confirmed_secc_type(struct OpenChaoJi_evcc_context_utility_pilot * context);

#endif

#endif
